package com.guaoran.user.utils;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
import java.security.Key;
import java.util.Map;
import java.util.UUID;

/**
 * JWT是json web token缩写。
 * 它将用户信息加密到token里，服务器不保存任何用户信息。服务器通过使用保存的密钥验证token的正确性，只要正确即通过验证。
 * 优点是在分布式系统中，很好地解决了单点登录问题，很容易解决了session共享的问题。
 * 缺点是无法作废已颁布的令牌/不易应对数据过期。
 */
public class JwtTokenUtils {


    public static void main(String[] args) {
        System.out.println(UUID.randomUUID().
                toString().replace("-", ""));
    }

    /**
     * 随机生成一个 UUID，来生成 key
     * @return
     */
    private static Key generatorKey() {
        SignatureAlgorithm saa = SignatureAlgorithm.HS256;
        byte[] bin = DatatypeConverter.parseBase64Binary
                ("77c2412527194322b02c721647dcf4ab");
        Key key = new SecretKeySpec(bin, saa.getJcaName());
        return key;
    }

    /**
     * 生成 token
     * @param payLoad
     * @return
     */
    public static String generatorToken(Map<String, Object> payLoad) {
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            return Jwts.builder()
                    .setPayload(objectMapper.writeValueAsString(payLoad))
                    .signWith(SignatureAlgorithm.HS256, generatorKey()).compact();
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     *  校验token
     * @param token
     * @return
     */
    public static Claims phaseToken(String token) {
        Jws<Claims> claimsJwt = Jwts.parser().setSigningKey(generatorKey()).parseClaimsJws(token);
        return claimsJwt.getBody();
    }
}
